package com.example.myapplication.a_class.a02_attribute

import com.example.myapplication.a_class.a04_expand.bean.SonBean

/**
 * 属性
 */

const val MY_CONST_VALUE : Int = 3

class Attribute {

    /**
     * var定义的【变量private】，但带有public的set和get属性：
     * val定义的【常量private】，带有public的get方法
     *
     * 上面-位于类外边
     * const val 可见性为public final static，可以直接访问。
     * val 可见性为private final static，并且val 会生成方法getNormalObject() ，通过方法调用访问。
     */
    var a : Int = 1
    val b : Int = 2


    /**
     * 默认实现 get,set ,也可以自定义
     * 幕后字段:field 标识符只能用在属性的访问器内。
     */
    var age : Int = 0
        get() {
            return 2
        }
        set(value) {
            field = 3
        }

    /**
     * 延时初始化,检测: d.isLateinit,不可以修饰基本类型
     */
    lateinit var d : String


    /**
     * 由于扩展没有实际的将成员插入类中，因此对扩展属性来说幕后字段是无效的。
     * 这就是为什么扩展属性不能有初始化器。他们的行为只能由显式提供的 getters/setters 定义。
     *  例如:
     */
//    val SonBean.number = 1 // 错误：扩展属性不能有初始化器
    var SonBean.number:Int
        set(value)  {code = value}
        get() = 2
}